home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Caml Light 0.7 / Caml Light 0.7 source / src / yacc / symtab.c < prev    next >
C/C++ Source or Header  |  1995-06-01  |  2KB  |  116 lines

  1. #include "defs.h"
  2.  
  3.  
  4. bucket **symbol_table;
  5. bucket *first_symbol;
  6. bucket *last_symbol;
  7.  
  8.  
  9. int
  10. hash(name)
  11. char *name;
  12. {
  13.     register char *s;
  14.     register int c, k;
  15.  
  16.     assert(name && *name);
  17.     s = name;
  18.     k = *s;
  19.     while (c = *++s)
  20.     k = (31*k + c) & (TABLE_SIZE - 1);
  21.  
  22.     return (k);
  23. }
  24.  
  25.  
  26. bucket *
  27. make_bucket(name)
  28. char *name;
  29. {
  30.     register bucket *bp;
  31.  
  32.     assert(name);
  33.     bp = (bucket *) MALLOC(sizeof(bucket));
  34.     if (bp == 0) no_space();
  35.     bp->link = 0;
  36.     bp->next = 0;
  37.     bp->name = MALLOC(strlen(name) + 1);
  38.     if (bp->name == 0) no_space();
  39.     bp->tag = 0;
  40.     bp->value = UNDEFINED;
  41.     bp->index = 0;
  42.     bp->prec = 0;
  43.     bp-> class = UNKNOWN;
  44.     bp->assoc = TOKEN;
  45.     bp->entry = 0;
  46.     bp->true_token = 0;
  47.  
  48.     if (bp->name == 0) no_space();
  49.     strcpy(bp->name, name);
  50.  
  51.     return (bp);
  52. }
  53.  
  54.  
  55. bucket *
  56. lookup(name)
  57. char *name;
  58. {
  59.     register bucket *bp, **bpp;
  60.  
  61.     bpp = symbol_table + hash(name);
  62.     bp = *bpp;
  63.  
  64.     while (bp)
  65.     {
  66.     if (strcmp(name, bp->name) == 0) return (bp);
  67.     bpp = &bp->link;
  68.     bp = *bpp;
  69.     }
  70.  
  71.     *bpp = bp = make_bucket(name);
  72.     last_symbol->next = bp;
  73.     last_symbol = bp;
  74.  
  75.     return (bp);
  76. }
  77.  
  78.  
  79. create_symbol_table()
  80. {
  81.     register int i;
  82.     register bucket *bp;
  83.  
  84.     symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  85.     if (symbol_table == 0) no_space();
  86.     for (i = 0; i < TABLE_SIZE; i++)
  87.     symbol_table[i] = 0;
  88.  
  89.     bp = make_bucket("error");
  90.     bp->index = 1;
  91.     bp->class = TERM;
  92.  
  93.     first_symbol = bp;
  94.     last_symbol = bp;
  95.     symbol_table[hash("error")] = bp;
  96. }
  97.  
  98.  
  99. free_symbol_table()
  100. {
  101.     FREE(symbol_table);
  102.     symbol_table = 0;
  103. }
  104.  
  105.  
  106. free_symbols()
  107. {
  108.     register bucket *p, *q;
  109.  
  110.     for (p = first_symbol; p; p = q)
  111.     {
  112.     q = p->next;
  113.     FREE(p);
  114.     }
  115. }
  116.